TerraformでAWS Glue ジョブ 定期実行させてみた(EventBridge スケジュール vs Glue トリガー)

TerraformでAWS Glue ジョブ 定期実行させてみた(EventBridge スケジュール vs Glue トリガー)

Clock Icon2024.08.21

こんにちは、ともぞうです。
今回のブログでは、Terraformを用いてAWS Glueジョブをある決まった時刻(毎日 JST AM9:00等)に定期実行させる方法(リソース)を2つ紹介します。

  1. EventBridge スケジュール
  2. Glue トリガー

前提

今回はTerraformを使用するため事前にインストールが必要になります。
使用したバージョンは下記となります。

  • Terraform・・・v1.9.0(provider registry.terraform.io/hashicorp/aws v5.63.0)

Terraformコード

① EventBridge スケジュール

タイムゾーンに日本を設定できます。

# EventBridge Schedulerの設定
resource "aws_scheduler_schedule" "eventbridge_schedule" {
  name       = "glue-job-invoke-scheduler" # スケジューラの名前を設定
  group_name = "default"                   # デフォルトのグループを使用

  # フレキシブルタイムウィンドウをOFFに設定
  flexible_time_window {
    mode = "OFF"
  }

  # スケジュール式の設定(例:毎日JST午前9時に実行)
  schedule_expression_timezone = "Asia/Tokyo"
  schedule_expression          = "cron(0 9 ? * * *)"

  # ターゲットの設定
  target {
    # この行が重要: Glueジョブを直接起動するためのAWS SDKアクションARN
    arn = "arn:aws:scheduler:::aws-sdk:glue:startJobRun"

    # EventBridge Schedulerが使用するIAMロールのARN
    role_arn = aws_iam_role.eventbridge_scheduler_role.arn

    # 起動するGlueジョブの設定
    input = jsonencode({
      JobName = "sample-glue-job" # 実行するGlueジョブの名前
    })
  }

  # スケジューラの状態を有効に設定
  state = "ENABLED"
}

# EventBridge Scheduler用のIAMロールを作成
resource "aws_iam_role" "eventbridge_scheduler_role" {
  name = "scheduled-glue-job-execution-role"

  # EventBridge Schedulerがこのロールを引き受けることを許可
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "scheduler.amazonaws.com"
        }
      }
    ]
  })
}

# AWSGlueServiceRoleポリシーをロールにアタッチ
resource "aws_iam_role_policy_attachment" "glue_service_role_attach" {
  role       = aws_iam_role.eventbridge_scheduler_role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole"
}

※HashiCorpのAWSプロバイダーに関するドキュメントページを参考にしています。

② Glue トリガー

タイムゾーンはUTCのみ設定できます。
そのため、JST時刻で設定したい場合は想定しているJST時刻から9時間引くことを忘れずに

resource "aws_glue_trigger" "example_trigger" {
  name              = "glue-job-invoke-trigger"   # Glueトリガーの名前を設定
  type              = "SCHEDULED"                 # Glueトリガーのタイプをスケジュールに設定
  schedule          = "cron(0 0 * * ? *)"         # 日本時間午前9時に毎日実行するためのCronスケジュール(UTC時間午前0時)
  start_on_creation = true                        # Glueトリガーを有効化

  actions {
    job_name = "sample-glue-job" # 実行するGlueジョブの名前を指定
  }
}

※HashiCorpのAWSプロバイダーに関するドキュメントページを参考にしています。

まとめ

基本的にどちらの方法を採用しても目的は達成できます。

EventBridge スケジュール、Glue トリガーをそれぞれ採用すべきユースケースを個人的に考えてみました。

  • EventBridge スケジュール

    • Glueジョブを定期実行するスケジューラの他にも、LambdaやStepFunctionを定期実行するスケジューラを全てEventBridge スケジュールで作成している場合など(管理がしやすい)
    • 何らかの原因(AWSの一時的なサービス障害や人為的ミス)によってスケジューラが正常に動作しない場合、DLQにメッセージを配信し、アラートをすぐに検知したい場合(エラーの迅速な察知ができる)
    • UTC時刻に限らず世界各国にスケジュールを管理したい場合(日本だけでなく様々な国の時刻に対応している)
  • Glue トリガー

    • EventBridge スケジュールをそもそも使うケースが少なく、スケジューラの一元管理場所がそもそもないケース。(後にEventBridgeスケジュールに移行するケースも考えられる)
    • スケジューラが正常に動作しなかったとしても被害がそもそも少ない場合。お試しで1週間だけGlueジョブを動かしてみるPoC等

以上です。

本稿が、Terraformを使ってAWS Glueを定期実行させたい 人の第一歩として参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.